/**
 * ReportGear(2011)
 */
package com.reportgear.report.model.auxiliary;

import org.dom4j.Element;

import com.reportgear.core.api.XmlSerializer;
import com.sot.core.util.NumberUtils;

/**
 * 抽象行列属性
 * 
 * @version 1.0 2011-3-12
 * @author <a herf="lexloo@gmail.com">lexloo</a>
 * @since Report 1.0
 * 
 */
public abstract class AbstractCRProperty<T extends CRTypeInterface> implements XmlSerializer {
	// 值，宽度或高度
	private int value;
	// 是否可见
	private boolean visible = true;
	// 类型
	protected T type;
	// 是否分组
	private transient boolean group;

	/**
	 * 获取属性类型
	 * 
	 * @return 属性类型
	 */
	public final T getType() {
		return this.type;
	}

	/**
	 * 设置属性类型
	 * 
	 * @param type
	 *            属性类型
	 */
	public final void setType(T type) {
		this.type = type;
	}

	/**
	 * 设置类型
	 * 
	 * @param typeName
	 *            类型名称
	 */
	public abstract void setType(String typeName);

	/**
	 * 设置值
	 * 
	 * @param value
	 *            值
	 */
	public void setValue(int value) {
		this.value = value;
	}

	/**
	 * 获取值
	 * 
	 * @return 值
	 */
	public int getValue() {
		return this.value;
	}

	/**
	 * 设置是否分组
	 * 
	 * @param group
	 *            是否分组
	 */
	public void setGroup(boolean group) {
		this.group = group;
	}

	/**
	 * @return 是否分组
	 */
	public boolean isGroup() {
		return group;
	}

	/**
	 * 设置是否可见
	 * 
	 * @param visible
	 *            可见性
	 */
	public void setVisible(boolean visible) {
		this.visible = visible;
	}

	/**
	 * 获取是否可见
	 * 
	 * @return 是否可见
	 */
	public boolean isVisible() {
		return visible;
	}

	@SuppressWarnings("unchecked")
	@Override
	public void read(Element parent) {
		Element el = parent.element("va");
		this.setValue(NumberUtils.convertToInteger(el.getTextTrim(), 0));

		el = parent.element("vi");
		this.setVisible("1".equals(el.getTextTrim()));

		el = parent.element("ty");
		this.setType((T) this.type.getByCode(el.getTextTrim()));
	}

	@Override
	public void write(Element parent) {
		Element el = parent.addElement("va");
		el.addText(String.valueOf(this.value));
		el = parent.addElement("vi");
		el.addText(this.visible ? "1" : "0");
		el = parent.addElement("ty");
		el.addText(this.type.getCode());
	}
}
